<?php
/**
* 名称：帐户控制器。
* 描述：帐户资料、密码维护的相关功能。
*/
final class Controller_Account_Password extends Controller_Public_Account{
    /**
    * 描述：密码修改之修改视图。
    * @access protected
    * @return void
    */
    protected function Edit(){
        self::$Template->Display('oui/account/password.html');
    }

    /**
    * 描述：密码修改之响应密码修改程式。
    * @access protected
    * @return void
    */
    protected function Update(){
        $oldPassword=post('old-password');
        $newPassword=post('new-password');
        //检查数据有效性。
        $this->Update_CheckData($oldPassword,$newPassword);
        //数据正确修改密码。
        $this->Update_ChangePassword(
            $this->Update_GetTruePassword(),
            $oldPassword,
            $newPassword
        );
    }

    /**
    * 描述：密码修改之校验请求数据。
    * @access protected
    * @param  string    $oldPassword 必选 用户提交的原密码。
    * @param  string    $newPassword 必选 用户提交的新密码。
    * @return void
    */
    private function Update_CheckData($oldPassword,$newPassword){
        $breakMessage=NULL;
        if(empty($oldPassword)){
            $breakMessage='请填写原密码！';
            goto x;
        }
        if(empty($newPassword)){
            $breakMessage='请填写新密码！';
            goto x;
        }
        x:if($breakMessage){
            Model_Break::Message($breakMessage);
            exit();
        }
    }

    /**
    * 描述：密码修改之更新密码。
    * @access protected
    * @param  string    $trueOldPassword 必选 原密码。
    * @param  string    $oldPassword     必选 用户提交的原密码。
    * @param  string    $newPassword     必选 用户提交的新密码。
    * @return void
    */
    private function Update_ChangePassword($trueOldPassword,$oldPassword,$newPassword){
        if($trueOldPassword===Model_Account::Hash($oldPassword)){
            $newPassword=Model_Account::Hash($newPassword);
            $result=self::$Database->ExecParameterized(
                'UPDATE '.self::$Database->Table('admin').' SET password=? WHERE username=?',
                array($newPassword,$this->Username)
            );
            //~
            Cookie::Set(Model_Account::COOKIE_PASSWORD,$newPassword);
            //~
            if($result){
                Model_Break::Success(
                    '密码己经修改成功，请牢记登录密码。',
                    array(
                        array('name'=>'返回上一页','href'=>'javascript:history.go(-1);')
                    ),
                    array(TRUE,10)
                );
            }
            else{
                Model_Break::Message('密码修改失败，请稍候再试！');
            }
        }
        else{
            Model_Break::Message('原密码错误，请重新输入！');
        }
    }

    /**
    * 描述：密码修改之获取原密码。
    * @access protected
    * @return string    存储在数据中的密码加密值。
    */
    private function Update_GetTruePassword(){
        return self::$Database->GetOne(
            'SELECT password FROM '.self::$Database->Table('admin').' WHERE username=?',
            array($this->Username)
        );
    }
}